03 Message组件
一、什么是Message组件
在LangChain中,Message组件是整个框架的核心数据结构之一,Message组件是整个上下文的载体,所有的用户输入、大模型输出、工具调用结果、最终都会被封装成Message对象进行传递,Message组件是Memory组件和LangGraph状态管理的基础。
二、消息的类型
在LangChain中将消息分为四种类型:
HumanMessage:用户输入的内容,对于支持多模态的LLM可以包含文本、图像、音频等形式的内容。
SystemMessage:系统提示词,可以定义角色、设定模型行为,为LLM提供上下文
AIMessage:LLM生成的相应内容,包括文本内容、工具调用信息、元数据信息
ToolMesssage:工具调用的结果
代码示例如下:
from datetime import datetime
import dotenv
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage, SystemMessage
from langchain.tools import tool
dotenv.load_dotenv()
# 1.定义工具及对应map
@tool
def get_current_time():
"""获取当前时间"""
return datetime.now().strftime('%Y-%m-%d %H:%M:%S')
tools_map = {
"get_current_time": get_current_time
}
# 2.创建model对象
model = init_chat_model(
"deepseek-v4-flash"
)
# 3.定义消息列表
human_message = HumanMessage("你好,你是谁?现在什么时间?")
system_message = SystemMessage("你是一个知识问答机器人,你叫老K")
message_list = [human_message, system_message]
# 4.绑定工具
bind_tool_model = model.bind_tools([get_current_time])
# 5.调用LLM模型
ai_message = bind_tool_model.invoke(message_list)
message_list.append(ai_message)
# 6.判断是否有函数调用
if ai_message.tool_calls:
tool_message = tools_map.get((ai_message.tool_calls[0].get("name"))).invoke(ai_message.tool_calls[0])
# 7.将工具调用结果ToolMessage添加到消息列表
message_list.append(tool_message)
# 7.再次调用model
ai_message = bind_tool_model.invoke(message_list)
print(ai_message.content)执行结果如下:

三、消息内容
3.1 content字段
在LangChain的消息类中,使用content属性来保存消息所承载的内容,但content是一个弱类型的属性,它可以用来保存字符串、对象列表等形式的信息。对于AIMessage类来说,content中保存了模型返回的原始内容信息。
现在很多LLM支持多模态,除了直接传递文本消息之外,我们还可以通过content传递图片消息:
# 传递字符串
human_message = HumanMessage("你好你是")
# 通过content传递多模态信息
human_message = HumanMessage(content=[
{"type": "text", "text": "这张图片是哪个动漫人物?"},
{"type": "image", "url": "https://image.baidu.com/a.jpg"}
])3.2 content_blocks字段
在LangChain v1.0中,除了content能保存消息内容之外,还提供了统一不同模型提供商标准的content_blocks字段,该字段的作用是:为了屏蔽不同LLM厂商传入/返回数据格式的差异,统一返回格式相同的内容,让使用者不用再根据模型不同处理一些兼容逻辑,这部分内容LangChain在内部就帮我们封装好了。
在没有content_blocks之前,可能OpenAI返回这样的格式:
{
"type":"reasoning",
"summary":"..."
}而Anthropic返回这样的格式:
{
"type":"thinking",
"thinking":"..."
}每个厂商都有自己的格式,我们就需要写大量的判断逻辑
if openai:
...
if anthropic:
...
if gemini:
...而现在从content_blocks中可以取到格式统一的信息
[
{
"type":"reasoning",
"reasoning":"..."
}
]比如在HumanMessage中使用content_blocks来填充多模态信息。
# 通过content_block传递多模态信息
human_message = HumanMessage(content_blocks=[
{"type": "text", "text": "这张图片是哪个动漫人物?"},
{"type": "image", "url": "https://image.baidu.com/a.jpg"}
])四、总结
在 LangChain 中,Message 组件用于保存对话消息。content 字段用于保存模型原始输入或输出内容,可能是字符串,也可能是 Provider 原生格式的数据结构。
content_blocks 字段是 LangChain 提供的标准化存储消息内容的字段,用于以统一格式访问消息内容。
由于 AIMessage 表示 LLM 的输出结果,因此, content_blocks 中通常会包含更丰富的内容类型,例如文本(text)、推理过程(reasoning)、工具调用(tool_call)、引用(citation)以及多模态等内容。